package com.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * 带着问题学源码
 * ⭕️ Spring boot自动装配原理？
 * Spring boot所有自动配置类在启动时扫描并加载，启动时扫描spring.factories文件内配置全限定类名
 * 第一次选择通过@Import的选择器决定注入哪些类
 * 第二次选择通过@ConditionalXxx注解决定注不注入当前类（只有配置了start的才可能会自动装配，即@ConditionalOnClass注解会判断xxx.class依赖存不存在）
 * 通过重重的条件判断后，最终被Spring容器管理的XxxAutoConfiguration类上的@Configuration注解表示该注解内的@Bean也会被Spring容器管理，即自动注入需要的Bean
 * 有了自动配置就免去了程序员手动配置xml和编写@Bean的过程
 */
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        // 启动Spring Boot
        /**
         * SpringApplication：主要做了以下四件事
         * 1️⃣推断应用是普通项目，还是web项目（普通项目运行完成后结束，web项目需要启动tomcat服务器）
         * 2️⃣查找所有可用初始化器，并设置到List<ApplicationContextInitializer<?>> initializers属性中
         * 3️⃣查找所有的程序监听器，并设置到List<ApplicationListener<?>> listeners属性中
         * 4️⃣推断并设置main方法的定义类，并找到运行的主类
         */
        SpringApplication.run(Application.class, args);
    }
}
